블로그 릴레이 - CloudWatch Logs의 지표 필터 생성하기

블로그 릴레이 - CloudWatch Logs의 지표 필터 생성하기

본 블로그에서는 CloudWatch Logs의 지표 필터를 사용해서 에러와 같은 특정 패턴의 로그가 발생 했을 시 알람을 보내는 방법을 정리했습니다.
Clock Icon2024.10.04

안녕하세요! AWS 사업 본부의 임채정입니다.

본 블로그는 당사의 한국어 블로그 릴레이의 열네 번째 블로그입니다.
이번 블로그의 주제는「CloudWatch Logs의 지표 필터 생성하기」입니다.

CloudWatch Logs

CloudWatch Logs는 AWS의 다양한 리소스의 로그를 실시간으로 수집하고 저장 하는 서비스 입니다.
수집한 로그 데이터는 해당 AWS 리소스 혹은 애플리케이션의 로그를 검색하고, 분석하며, 알림을 설정할 수 있습니다.

오늘 블로그에서는 CloudWatch Logs의 기능인 지표 필터를 통해 로그 데이터를 검색하고 필터링해서 CloudWatch 지표로 변환해보겠습니다.
이렇게 변환한 데이터는 지표 페이지에서 그래프로 표시하거나 CloudWatch 경보를 설정할 수도 있습니다.

지표 필터 테스트를 위한 로그 그룹 생성

먼저 지표 필터를 테스트하기 위해서는 CloudWatch의 로그 그룹을 생성해야 합니다.
로그 그룹은 수동으로 생성할 수도 있지만 이번 블로그에서는 RDS를 하나 생성해서 RDS의 로그를 CloudWatch Logs 에 수집하도록 설정하겠습니다.

생성한 RDS의 설정은 다음과 같습니다.

  • 엔진 버전 : PostgreSQL 16.3-R2 (기본값)
  • DB 식별자 : cloudwatch-test
  • 인스턴스 타입 : db.t3.micro
  • 스토리지 유형 : 범용 SSD(gp3) - 20GiB
  • 로그 내보내기 : ⭐️ [PostgreSQL 로그] ⭐️ 체크박스에 체크
    • 이 설정을 통해 CloudWatch Logs에 로그 수집

RDS를 생성하고 잠시 기다리면 CloudWatch의 로그 그룹이 하나 생성됩니다.

cw00

지표 필터 생성

지금부터 지표 필터를 생성하겠습니다.
먼저 CloudWatch 페이지의 로그 그룹에 들어가서 지표 필터 탭을 선택하고 지표 필터 생성 버튼을 클릭합니다.

cw01

1. 필터 패턴 생성

가장 먼저 필터링할 패턴을 입력해야 합니다.
블로그에서는 필터링 하고 싶은 패턴이 에러가 발생하는 경우이기 때문에 간단하게 ERROR 이라고 입력합니다.
그러면 ERROR 이라는 문자가 들어간 로그를 감지해서 작성한 지표로 데이터를 보내 그래프에 표시하거나 경보를 설정할 수도 있습니다.

  • 패턴 필터링 : ERROR

2. 패턴 테스트

그 후에 밑에 있는 패턴 테스트 부분에서 입력한 필터가 어떤 식으로 필터링 되는지 확인할 수 있습니다.
테스트할 로그 데이터를 RDS 로그 스트림인 cloudwatch-test.0 (로그 스트림명은 RDS 생성할 때 설정한 DB 식별자로 표시) 으로 변경합니다.
그러면 cloudwatch-test.0에서 실제로 발생한 로그 이벤트 메시지로 변경해서 테스트할 수 있습니다.

cw02

만약 원하는 로그 메시지가 있다면 수동으로 입력해서 추가할 수도 있습니다.
단, 최대 50개의 로그 메시지만 테스트할 수 있으니 다음과 같은 에러문이 표시되면 기존 로그를 삭제하고 로그를 추가해야 합니다.

cw03

3. 지표 세부 설정

패턴 테스트에서 원하는 결과가 나왔으면 다음 페이지로 넘어갑니다.
필터링의 이름은 알기 쉽게 임의로 입력합니다.

  • 이름 필터링 : ERROR (임의로 입력)

그리고 작성할 지표에 대한 세부 설정을 할 수 있습니다.

  • 지표 네임스페이스 : PostgreSql-Log
  • 지표 이름 : ERROR-TEST
  • 지표 값 : 1

먼저, 지표 네임스페이스는 CloudWatch 지표를 나누는 컨테이너입니다. 지표 필터를 통해 만드는 지표는 사용자 지정 네임스페이스에 저장이 되는데 기존의 생성한 네임스페이스도 선택할 수 있고 새로운 네임스페이스에 저장할 수도 있습니다.

cw04

그 다음으로 지표 이름은 단어 그대로 실제로 표시되는 지표의 이름을 설정합니다.
설정한 지표 이름은 다음과 같이 지표에서 확인할 수 있습니다.

cw05

지표값은 패턴에서 설정한 로그가 감지되었을 때 지표에 게시되는 값입니다.
이번에는 1을 설정했기 때문에 로그가 패턴에 걸리면 지표에 1이 표시됩니다.

cw06

4. 지표 세부 설정 (선택사항)

  • 기본 값 (선택사항) : 0
  • Unit (선택사항): 개수

기본 값은 비워둘 수도 있는 설정입니다.
기본 값을 비워두면 감지되는 데이터가 없을 때 지표는 아무런 값도 표시하지 않습니다.
값을 설정해두면 지표에 감지되는 데이터가 없을 때 해당 값을 설정합니다.
예를 들어 기본 값을 0 으로 설정을 했을 때의 예시입니다.
위에서 아무 값도 설정하지 않을 때와 비교해보면 알기 쉽습니다.

cw07

Unit은 지표에 할당할 단위를 선택하는 설정입니다.
아무 것도 설정하지 않으면 None 이고 단위를 선택하면 선택한 단위로 설정됩니다.

다음과 같이 Unit 을 개수로 설정해보면 지표의 단위 값이 Count 로 변경된 걸 확인할 수 있습니다.

cw08

5. 지표 세부 설정 (차원)

차원 설정은 로그의 특정 속성을 필터링하고 분석할 수 있는 기능입니다.
차원 설정을 하려면 기본 값을 사용할 수 없습니다.

또한, 차원을 사용하려면 특정 패턴 필터링이 필요합니다.
특정 패턴에 대한 정보는 다음 페이지에서 확인할 수 있습니다.
https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/FilterAndPatternSyntaxForMetricFilters.html

설정 예시

  • 패턴 필터링 : ⭐️ [date,time,header=%ERROR%,message] ⭐️
  • 지표 네임스페이스 : PostgreSql-Log
  • 지표 이름 : ERROR-TEST
  • 지표 값 : 1
  • 기본 값 (선택사항) : ⭐️ - ⭐️
  • Unit (선택사항): 개수
  • 차원 : ⭐️ message(차원 이름) - $message(차원 값) ⭐️

예를 들어 패턴 필터링을 [date,time,header=%ERROR%,message] 로 했을 경우에 패턴 테스트를 실행하면 다음과 같은 결과가 나옵니다.
띄어쓰기를 기준으로 나눠지고, header 에 ERROR 라는 문자가 포함되어 있는 로그만 감지하는 필터링입니다.

테스트 결과 ↓

이벤트 번호 $date $time $header $message
29 2024-10-04 11:58:49 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: null value in column "name" of relation "test_table" violates not-null constraint
38 2024-10-04 13:51:14 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: syntax error at or near "FORM" at character 10
42 2024-10-04 13:52:57 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: relation "non_existing_table" does not exist at character 15
44 2024-10-04 13:53:01 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: null value in column "name" of relation "test_table" violates not-null constraint
47 2024-10-04 13:53:03 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: invalid input syntax for type integer: "abc" at character 8
49 2024-10-04 13:53:06 UTC:xx.xx.xx.xx(58796):postgres@postgres:[19677]:ERROR: syntax error at or near "FORM" at character 10

여기서 차원의 값을 $message 로 설정해보겠습니다.
그러면 다음과 같이 메시지 별로 지표를 생성합니다.

cw09

이렇게 설정을 하면 CloudWatch 지표에서 에러 메시지 별로 지표를 확인할 수 있기 때문에 에러 코드별로 발생 빈도를 추적하고 모니터링 할 수 있지만 반대로 에러마다 지표를 만들어버리면 너무 많은 지표가 만들어지기 때문에 지표 리소스의 낭비나 비용의 증가로 이어질 수 있기 때문에 주의해야 합니다.

이외에도 블로그에서는 검증하지 않았지만 로그에 특정 서비스나 어플리케이션 이름, 환경 등이 포함되어 있으면 그 걸 차원 설정하여 에러나 성능 지표 등을 모니터링할 수 있을 것 같습니다.

마무리

이상, 한국어 블로그 릴레이의 「CloudWatch Logs의 지표 필터 생성하기」편이었습니다.
다음 블로그 릴레이는 10월 두번째 주에 공개됩니다.

끝까지 읽어주셔서 감사합니다!
AWS 사업 본부의 임채정이었습니다.

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.